// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
// 当你运行npm run dev的时候就从main.js这个入口文件开始执行了
import Vue from 'vue';
// 引入element UI
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App';
// 引入路由
import router from './router';
// 引入状态管理
import store from './vuex/store';
// 引入icon
import './assets/icon/iconfont.css'
// 

// 引入echarts
import echarts from 'echarts'
Vue.prototype.$echarts = echarts

import axios from 'axios';
Vue.prototype.$axios = axios;

Vue.config.productionTip = false;

//配置是否校验的开关
let openAuthenticate = true;
//配置是否授权的开关
let openAuthorize = true;

// 使用element UI
Vue.use(ElementUI);
// 过滤器
import * as custom from './utils/util'
// 导入jwt方法
import utilApi from './utils/jwtutils'
// 导入userMG
import * as userMG from './api/userMG'

Object.keys(custom).forEach(key => {
    Vue.filter(key, custom[key])
})

// 路由拦截器(在main.js中添加路由监控代码，在路由变化时校验用户的身份)
// 1、如果成功从sessionStorage和cookie获取当前用户则继续访问
// 2、如果sessionStorage中无当前用户，cookie中有当前用户则请求服务端获取jwt，如果成功则继续访问。
// 3、以上两种情况都不满足则跳转到登录页面。
router.beforeEach((to, from, next) => {
    if(openAuthenticate){  //打开身份校验  
      // console.log(to)
      // console.log(from)
      //***********身份校验***************
      let activeUser
      let uid
      try{
        activeUser = utilApi.getActiveUser()  //从sessionStorage获取当前用户
        uid = utilApi.getCookie("uid")        //从Cookie中取出uid
      }catch(e){
        alert(e)
      }
      if(activeUser && uid && uid == activeUser.uid) {  //如果用户一致，则继续访问
        next();
      }else if(to.path =='/login' || to.path =='/logout'){  //如果访问路径是登陆活退出，则继续访问
        next();
      }else if(uid){  //sessionStorage中无当前用户,cookie中有当前用户则请求服务端获取jwt,如果成功则继续访问
        //请求获取jwt
        userMG.getjwt().then((res)=>{
          if(res.success){
            let jwt = res.jwt;
            let activeUser = utilApi.getUserInfoFromJwt(jwt)    //解析jwt令牌，获取用户信息
            if(activeUser){
              utilApi.setUserSession("activeUser",JSON.stringify(activeUser))   //用户信息存储在sessionStorage中
            }
            next();   //继续访问
          }else{
            //跳转到统一登陆
            window.location = "http://localhost:40400/#/login?returnUrl="+ Base64.encode(window.location)
            next();
          }
        })
      }else{
        //跳转到统一登陆
        next({
            path: '/login',
            query: { redirect: to.fullPath } // 将跳转的路由path作为参数，登录成功后跳转到该路由
        })
      }
    }else{
      next();
    }
});

//授权
router.afterEach((to, from, next) => {
  if(openAuthorize){
    let activeUser
    try{
      activeUser = utilApi.getActiveUser();
    }catch(e){
      alert(e)
    }
    if(activeUser) {
      //权限校验
      let requiresAuth = to.meta.requiresAuth;
      let permission = to.meta.permission;
      if(requiresAuth && permission){
        utilApi.checkAuthorities(router,permission);
      }
    }
  }

});


/* 原始代码
router.beforeEach((to, from, next) => {
    if (to.matched.length != 0) {
        if (to.meta.requireAuth) { // 判断该路由是否需要登录权限
            if (Boolean(localStorage.getItem("userInfo"))) { // 通过vuex state获取当前的user是否存在
                next();
            } else {
                next({
                    path: '/login',
                    query: { redirect: to.fullPath } // 将跳转的路由path作为参数，登录成功后跳转到该路由
                })
            }
        } else {
            if (Boolean(localStorage.getItem("userInfo"))) { // 判断是否登录
                if (to.path != "/" && to.path != "/login") { //判断是否要跳到登录界面
                    next();
                } else {
                    // 防刷新，如果登录，修改路由跳转到登录页面，修改路由为登录后的首页 
                    next({
                        path: '/goods/Goods'
                    })
                }
            } else {
                next();
            }
        }
    } else {
        next({
            path: '/login',
            query: { redirect: to.fullPath } // 将跳转的路由path作为参数，登录成功后跳转到该路由
        })
    }
})
*/

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求向header添加jwt
    let jwt = utilApi.getJwt()
    if(jwt){
      config.headers['Authorization'] = 'Bearer '+jwt
    }
    return config;
  }, function (error) {
    return Promise.reject(error);
});

// 响应拦截(提示权限不足)
axios.interceptors.response.use(data => {
    console.log("data=")
    console.log(data)
    if(data && data.data){
      if(data.data.code && data.data.code =='10001'){
        //需要登录,转到登陆页面
        router.push({
          path: '/login',
          query: {returnUrl: Base64.encode(window.location)}
        })
        window.location = "http://localhost:40400/#/login?returnUrl="+ Base64.encode(window.location)
      }else if(data.data.code && data.data.code =='10002'){
        Message.error('您没有此操作的权限，请与客服联系！');
      }else if(data.data.code && data.data.code =='10003'){
        Message.error('认证被拒绝，请重新登录重试！');
      }
    }
    return data
});

/* eslint-disable no-new */
new Vue({
    el: '#app',
    router,
    store, //使用store vuex状态管理
    components: { App },
    template: '<App/>',
    data: {
        // 空的实例放到根组件下，所有的子组件都能调用
        Bus: new Vue()
    }
})